/*
 * CrearUser.java
 *
 * Created on 24 de julio de 2007, 10:45 AM
 */

package administrador;
import javax.swing.*;
import java.sql.*;
/**
 *
 * @author  nexxus
 */
public class CrearUser extends javax.swing.JFrame {
    Conexion conexion;
    UsuariosAdmin uadmin;
    String acceso="";
    /** Creates new form CrearUser */
    public CrearUser(Conexion c,UsuariosAdmin ua) {
        uadmin=ua;
        conexion=c;
        initComponents();
        nuevoCodigo();
        this.setSize(370,350);
        this.setVisible(true);
        bt_crear.setText("Insertar");
       
        txt_nom.setEditable(true);
        txt_login.setEditable(true);
        
    }
    public CrearUser(Conexion c,UsuariosAdmin ua, int fila) {
        uadmin=ua;
        conexion=c;
        initComponents();
        this.setSize(370,350);
        this.setVisible(true);
        cargarDatos(fila);
        bt_crear.setText("Modificar");
        
        
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        txt_nom = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        bt_crear = new javax.swing.JButton();
        cb_priv = new javax.swing.JComboBox();
        jLabel6 = new javax.swing.JLabel();
        lbl_cod = new javax.swing.JLabel();
        txt_clave = new javax.swing.JPasswordField();
        txt_confClave = new javax.swing.JPasswordField();
        ck_habilitado = new javax.swing.JCheckBox();
        txt_login = new javax.swing.JTextField();
        jLabel7 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createTitledBorder("Crear Usuario")));
        jPanel1.setLayout(null);

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 14));
        jLabel1.setForeground(new java.awt.Color(102, 0, 0));
        jLabel1.setText("Nuevo Usuario");
        jPanel1.add(jLabel1);
        jLabel1.setBounds(30, 10, 130, 40);

        jLabel2.setText("Nombre:");
        jPanel1.add(jLabel2);
        jLabel2.setBounds(30, 80, 50, 20);

        txt_nom.setEditable(false);
        jPanel1.add(txt_nom);
        txt_nom.setBounds(80, 80, 210, 20);

        jLabel3.setText("Privilegios:");
        jPanel1.add(jLabel3);
        jLabel3.setBounds(30, 110, 60, 20);

        jLabel4.setText("Clave:");
        jPanel1.add(jLabel4);
        jLabel4.setBounds(170, 140, 50, 20);

        jLabel5.setText("Confirmar Clave:");
        jPanel1.add(jLabel5);
        jLabel5.setBounds(30, 170, 90, 20);

        bt_crear.setText("Crear Usuario");
        bt_crear.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_crearActionPerformed(evt);
            }
        });
        jPanel1.add(bt_crear);
        bt_crear.setBounds(80, 210, 110, 23);

        cb_priv.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Administrador", "Empleado" }));
        jPanel1.add(cb_priv);
        cb_priv.setBounds(80, 110, 210, 20);

        jLabel6.setText("Codigo:");
        jPanel1.add(jLabel6);
        jLabel6.setBounds(210, 50, 60, 14);
        jPanel1.add(lbl_cod);
        lbl_cod.setBounds(250, 50, 34, 14);
        jPanel1.add(txt_clave);
        txt_clave.setBounds(200, 140, 90, 20);
        jPanel1.add(txt_confClave);
        txt_confClave.setBounds(120, 170, 170, 20);

        ck_habilitado.setSelected(true);
        ck_habilitado.setText("habilitado");
        ck_habilitado.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
        ck_habilitado.setMargin(new java.awt.Insets(0, 0, 0, 0));
        jPanel1.add(ck_habilitado);
        ck_habilitado.setBounds(210, 210, 63, 20);

        txt_login.setEditable(false);
        jPanel1.add(txt_login);
        txt_login.setBounds(79, 140, 80, 20);

        jLabel7.setText("Login:");
        jPanel1.add(jLabel7);
        jLabel7.setBounds(30, 140, 34, 20);

        getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);

        pack();
    }// </editor-fold>//GEN-END:initComponents
public void BorroUsuario(){
// TODO add your handling code here:
      String codigo=lbl_cod.getText();
           //Realizo la moficacion del Cliente si es el caso que existe:
               ////System.out.println("Aplasto Modificar");
                int opccion=0;
                opccion=JOptionPane.showConfirmDialog(this,"Seguro Desea Borrar este Usuario","Alerta",0);
                if(opccion==0){
                     conexion.actualizarBase("delete from usuario where cod_usuario="+codigo+";");
                     //cierro ventana
                     uadmin.refrescar();
                     this.dispose();  
      
               
            }
}    public void nuevoCodigo(){
        try{
            ResultSet r=conexion.consultarBase("select MAX(cod_usuario) from usuario");
            r.next();
            int numero=r.getInt(1)+1;
           //System.out.println("Numero Factura Generado: "+numero);
            lbl_cod.setText(String.valueOf(numero));
         } catch(java.sql.SQLException e){};
    }
    
    public void cargarDatos(int fila){
    String codigo=uadmin.tabla.getValueAt(fila,0).toString();    
    lbl_cod.setText(codigo);
    ResultSet r=conexion.consultarBase("select * from usuario where cod_usuario="+codigo+";");
    
    try {
        r.next();
        txt_login.setText(r.getString(2));
        if(r.getString(3).equals("m")){
        cb_priv.setSelectedIndex(0);
        }else{
        cb_priv.setSelectedIndex(1);
        }
        txt_clave.setText(r.getString(4));
        txt_confClave.setText(r.getString(4));
        String habil=r.getString(5);
        txt_nom.setText(r.getString(6));
        if(habil.equals("1")){
        ck_habilitado.setSelected(true);}else{
        ck_habilitado.setSelected(false);}
        boolean accesoLocal=r.getBoolean(7);
         
        

    } catch (SQLException ex) {
        ex.printStackTrace();
    }
    
    }
    private void bt_crearActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_crearActionPerformed
// TODO add your handling code here:
     accionBoton();    
        
    }//GEN-LAST:event_bt_crearActionPerformed
    
    public void accionBoton(){
        //Obtengo los datos de la ventana
        String codigo=lbl_cod.getText();
        String nombre=txt_nom.getText().toLowerCase();
        String clave=txt_clave.getText().toLowerCase().replaceAll(" ","");
        String confclave=txt_confClave.getText().toLowerCase().replaceAll(" ","");
        String login=txt_login.getText().toLowerCase().replaceAll(" ","");
        //Defino Privilegio
        String priv;
        if(cb_priv.getSelectedIndex()==0){
            priv="m";
        } else{priv="e";}
        
        
        //Obtengo el Metodo de Acceso:
        boolean macceso=false;
        acceso="%";
        
        
        //Obtengo Habilitacion
        char habilitado='0';
        if(ck_habilitado.isSelected()){habilitado='1';}

        //Realizo las Validaciones:
        //Valido que llenen todos los datos:
        if(nombre.equals("")||clave.equals("")||confclave.equals("")||login.equals("")||acceso.equals("")) {
            JOptionPane.showMessageDialog(this,"Los datos no han sido llenados correctamente","Informacion",JOptionPane.INFORMATION_MESSAGE);
        }else{
            
            //Controla el Ingreso de Claves:
            if(!clave.equals(confclave)){
                JOptionPane.showMessageDialog(this,"Las Claves deben ser las mismas","Informacion",JOptionPane.INFORMATION_MESSAGE);
            }else{
            
             
           //Realizo la insercion del Cliente si es el caso:
            
           if(bt_crear.getText().equals("Insertar"))
            {
           
               //Verifico que Usuario no exista:
             ResultSet resp=conexion.consultarBase("select * from usuario where nombre like '"+nombre+"';");
             if(conexion.obtenerFilas(resp)>0){
             JOptionPane.showMessageDialog(this,"Ya existe un Usuario con este Nombre","Informacion",JOptionPane.INFORMATION_MESSAGE);
             
             }else{
           
               
               
               boolean exito1=false;
                boolean exito2=false;
                
                conexion.consultarBase("START TRANSACTION;");
               //System.out.println("Realizo la transaccion = INGRESION DE USUARIOS");
                try{
                //Inserto nuevo usuario Codigo Login Priv Clave Estado Nombre
                    
                exito1=conexion.insertarDatosR("insert into usuario values(null,'"+login+"','"+priv+"',password('"+clave+"'),'"+habilitado+"','"+nombre+"',"+macceso+")");
                
                //Inserto las modificaciones en el Log
                String hora=new java.sql.Time(System.currentTimeMillis()).toString();
                String fecha=new java.sql.Date(System.currentTimeMillis()).toString();
                String Accion="Insert";
                String usuario=uadmin.user.getNombre();
                String afectado=nombre;
                String datoNuevo="User="+nombre+" "+" Priv:"+priv+" Clave:"+clave;
                String datoAntig="Ninguno";
                
                //Realizo la insercion en el LOG de MODIFICACIONES
                exito2=conexion.insertarDatosR("insert into logusuario values(null,'"+fecha+"','"+hora+"','"+Accion+"','"+usuario+"','"+afectado+"','"+datoNuevo+"','"+datoAntig+"');");
                insUsuarioBD(login,"localhost",clave,priv);
                
                
                if(exito1&&exito2){
                conexion.consultarBase("COMMIT;");
                }else{
                    conexion.consultarBase("ROLLBACK;");
                }
                
                //cierro ventana
                uadmin.refrescar();
                this.dispose();
                
                }catch(Exception e){
                    
                
                }
            }
          
           } 
            
            if(bt_crear.getText().equals("Modificar")){
            //Realizo la moficacion del Cliente si es el caso que existe:
                //Obtengo datos de Usuario Anteriores
                ResultSet res=conexion.consultarBase("select * from usuario where nombre='"+nombre+"';");
                String privAnt="";
                String claveAnt="";
                String habilAnt="";
                String usuarioAnt="";
                boolean accesoAnt=false;
                
                try {
                    res.next();
                    usuarioAnt=res.getString(2);
                    privAnt=res.getString(3);
                    claveAnt=res.getString(4);
                    habilAnt=res.getString(5);
                    accesoAnt=res.getBoolean(7);

                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
                
                int filas=conexion.obtenerFilas(res);
                if (filas==0){
                 JOptionPane.showMessageDialog(this,"Este Usuario no Existe","Informacion",JOptionPane.INFORMATION_MESSAGE);
                }else{
               ////System.out.println("Aplasto Modificar");
                 conexion.actualizarBase("update usuario set nombre='"+nombre+"',clave=password('"+clave+"'),privilegios='"+priv+"',estado="+habilitado+",macceso="+macceso+" "+
                                        " where cod_usuario="+codigo+";");
                 
                
                 //Inserto las modificaciones en el Log
                String hora=new java.sql.Time(System.currentTimeMillis()).toString();
                String fecha=new java.sql.Date(System.currentTimeMillis()).toString();
                String Accion="Update";
                String usuario=uadmin.user.getNombre();
                String afectado=nombre;
                
                String datoNuevo="";
                String datoAntig="";
                
                
               //System.out.println("El privilegio anterior es:"+privAnt+" privilegio nuevo es:"+priv);                        
                if(!privAnt.equals(priv)){
                   datoAntig="Priv="+privAnt+" ";
                   datoNuevo="Priv="+priv+" ";
                }
               //System.out.println("El clave anterior es:"+claveAnt+" clave nuevo es:"+clave);
                if(!claveAnt.equals(clave)){
                   datoAntig=datoAntig+"Clave="+claveAnt+" ";
                   datoNuevo=datoNuevo+"Clave="+clave+" ";
                }
                if(!habilAnt.equals(habilitado)){
                   datoAntig=datoAntig+"Estado="+habilAnt+" ";
                   datoNuevo=datoNuevo+"Estado="+habilitado+" ";
                }
                
                actualizoPriClaveBD(priv,clave,nombre,usuarioAnt);
                
                //Realizo la insercion en el LOG de MODIFICACIONES
                conexion.insertarDatos("insert into logusuario values(null,'"+fecha+"','"+hora+"','"+Accion+"','"+usuario+"','"+afectado+"','"+datoNuevo+"','"+datoAntig+"');");
                
                 
               //cierro ventana
                uadmin.refrescar();
                this.dispose();  
                }
            }
                
                
                
           
            }
            
            
            
            
        }
    
    }
    
    //Actualizo Clave:
    public void actualizoPriClaveBD(String priv,String clave,String nombre,String usuario){
        
    //Inserto el usuario en la nueva 
    conexion.consultarBase("use mysql");
    //Actualizo Clave y Acceso Base de Datos:
    conexion.ejecutarComando("UPDATE user SET Password = PASSWORD('"+clave+"'),Host = '%' WHERE User like '"+nombre+"';");
    conexion.ejecutarComando("FLUSH PRIVILEGES;");
    
    //Actualizo Privilegios:    
    conexion.ejecutarComando("REVOKE ALL PRIVILEGES, GRANT OPTION FROM '"+usuario+"'@'%';");
    conexion.ejecutarComando("FLUSH PRIVILEGES;");
    String acciones="";
    if(priv.equals("e")){
    //Otorgo los privilegios a este usuario:
    acciones="FLUSH PRIVILEGES;"+
            "grant select on bdmultiadmin.* to '"+usuario+"'@'%';" +
            "grant all on bdmultiadmin.cliente to '"+usuario+"'@'%';" +
            "grant insert,update on bdmultiadmin.pedido to '"+usuario+"'@'%';" +
            "grant insert,update on bdmultiadmin.dtl_pedido to '"+usuario+"'@'%';" +
            "grant insert,update on bdmultiadmin.nota to '"+usuario+"'@'%';" +
            "grant insert,update on bdmultiadmin.dtl_nota to '"+usuario+"'@'%';" +
            "grant insert,update on bdmultiadmin.asiento to '"+usuario+"'@'%';" +
            "grant insert,update on bdmultiadmin.dtl_asiento to '"+usuario+"'@'%';" +
            "grant update on bdmultiadmin.itm_bodega to '"+usuario+"'@'%';" +
            "grant update on bdmultiadmin.producto to '"+usuario+"'@'%';" +
            "grant insert on bdmultiadmin.categoria to '"+usuario+"'@'%';" +
            "grant insert on bdmultiadmin.fpago to '"+usuario+"'@'%';" +
            "grant insert on bdmultiadmin.cuentaspendientes to '"+usuario+"'@'%';" +
            "grant insert on bdmultiadmin.pagoscc to '"+usuario+"'@'%';" +
            "grant insert on bdmultiadmin.aud_factura to '"+usuario+"'@'%';" +
            "grant insert on bdmultiadmin.aud_parametros to '"+usuario+"'@'%';" +
            "grant insert on bdmultiadmin.aud_productos to '"+usuario+"'@'%';" +
            "grant update on bdmultiadmin.aud_factura to '"+usuario+"'@'%';" +
            "grant update on bdmultiadmin.aud_parametros to '"+usuario+"'@'%';" +
            "grant update on bdmultiadmin.aud_productos to '"+usuario+"'@'%';";
    
    
    }else if(priv.equals("m")) {
     acciones="FLUSH PRIVILEGES;"+
            "GRANT ALL ON bdmultiadmin.* to '"+usuario+"'@'%';";
    }
    
    
    //Creo la lista de acciones a realizar:
    String[] listaAcciones=acciones.split(";");
    
    int contador=listaAcciones.length;
    for(int i=0;i<contador;i++){
    conexion.ejecutarComando(listaAcciones[i]);
    }
    
    //Regreso la conexion a la base del sistema:
    conexion.consultarBase("use bdmultiadmin");
    
    }
    
    
    public boolean existeUsuario(String nombre){
    boolean existe=false;
    ResultSet resp=conexion.consultarBase("select * from usuario where nombre like'"+nombre+"'");
    if(conexion.obtenerFilas(resp)>0){
    existe=true;
    }
    return existe;
    }
    
    
    
    public void insUsuarioBD(String usuario,String acceso,String pass,String priv){
    //Inserto el usuario en la nueva 
    conexion.consultarBase("use mysql");
    
    
    
    
    
    
    String acciones="";
    if(priv.equals("e")){
    //Otorgo los privilegios a este usuario:
    acciones="INSERT INTO user (Host,User,Password,ssl_cipher,x509_issuer,x509_subject)   VALUES('%','"+usuario+"',PASSWORD('"+pass+"'),'','','');"+
            "FLUSH PRIVILEGES;"+
            "grant select on bdmultiadmin.* to '"+usuario+"'@'%';" +
            "grant all on bdmultiadmin.cliente to '"+usuario+"'@'%';" +
            "grant insert,update on bdmultiadmin.pedido to '"+usuario+"'@'%';" +
            "grant insert,update on bdmultiadmin.dtl_pedido to '"+usuario+"'@'%';" +
            "grant insert,update on bdmultiadmin.nota to '"+usuario+"'@'%';" +
            "grant insert,update on bdmultiadmin.dtl_nota to '"+usuario+"'@'%';" +
            "grant insert,update on bdmultiadmin.asiento to '"+usuario+"'@'%';" +
            "grant insert,update on bdmultiadmin.dtl_asiento to '"+usuario+"'@'%';" +
            "grant update on bdmultiadmin.itm_bodega to '"+usuario+"'@'%';" +
            "grant update on bdmultiadmin.producto to '"+usuario+"'@'%';" +
            "grant insert on bdmultiadmin.categoria to '"+usuario+"'@'%';" +
            "grant insert on bdmultiadmin.fpago to '"+usuario+"'@'%';" +
            "grant insert on bdmultiadmin.cuentaspendientes to '"+usuario+"'@'%';" +
            "grant insert on bdmultiadmin.pagoscc to '"+usuario+"'@'%';" +
            "grant insert on bdmultiadmin.aud_factura to '"+usuario+"'@'%';" +
            "grant insert on bdmultiadmin.aud_parametros to '"+usuario+"'@'%';" +
            "grant insert on bdmultiadmin.aud_productos to '"+usuario+"'@'%';" +
            "grant update on bdmultiadmin.aud_factura to '"+usuario+"'@'%';" +
            "grant update on bdmultiadmin.aud_parametros to '"+usuario+"'@'%';" +
            "grant update on bdmultiadmin.aud_productos to '"+usuario+"'@'%';";
    
    
    }else if(priv.equals("m")) {
     acciones="INSERT INTO user (Host,User,Password,ssl_cipher,x509_issuer,x509_subject,Select_priv,Insert_priv,Super_priv)   VALUES('%','"+usuario+"',PASSWORD('"+pass+"'),'','','','Y','Y','Y');"+
            "FLUSH PRIVILEGES;"+
            "GRANT ALL ON bdmultiadmin.* to '"+usuario+"'@'%';";
    }
    
    
    //Creo la lista de acciones a realizar:
    String[] listaAcciones=acciones.split(";");
    
    int contador=listaAcciones.length;
    for(int i=0;i<contador;i++){
    conexion.ejecutarComando(listaAcciones[i]);
    }
    
    //Regreso la conexion a la base del sistema:
    conexion.consultarBase("use bdmultiadmin");
    
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton bt_crear;
    private javax.swing.JComboBox cb_priv;
    private javax.swing.JCheckBox ck_habilitado;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JLabel lbl_cod;
    private javax.swing.JPasswordField txt_clave;
    private javax.swing.JPasswordField txt_confClave;
    private javax.swing.JTextField txt_login;
    public javax.swing.JTextField txt_nom;
    // End of variables declaration//GEN-END:variables
    
}
